package com.zhiyou100.api.io_demo;

import java.io.*;
import java.time.LocalDate;

public class Demo {

    /*public static void main(String[] args) throws IOException, ClassNotFoundException {

        BookInfo bookInfo = new BookInfo("100110", "Java基础", 89, "老薛", LocalDate.now());
        BookInfo bookInfo1 = new BookInfo("100111", "Java高级", 89, "老薛", LocalDate.now());
        String path = "D:\\books.txt";
        File file = new File(path);
        if (!file.exists()) {
            file.createNewFile();
        }

        FileOutputStream fos = new FileOutputStream(file, true);
        ObjectOutputStream ops = null;
        //创建对象输出流,将对象写入文件中
        if (file.length() < 1){
            ops = new ObjectOutputStream(fos);
        }else {
            ops = new MyObjectOutputStream(fos);
        }
        //向文件中写入要保存的对象，注意，此时我们的BookInfo必须实现序列化接口
        ops.writeObject(bookInfo);
        ops.writeObject(bookInfo1);
        //创建对象输入流，将文件中保存的对象信息获取
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
        while (true){
            try {
                Object o = ois.readObject();
                System.out.println("o = " + o);
                //EOFException表示输入期间意外到达文件结尾或流结尾。
            }catch (EOFException e){
                //当读取到末尾时，此时等于文件读取完毕，相当于文件自动关闭，导致意外结束，此处手动处理并结束循环
                System.out.println("读取到文件末尾，文件读取结束");
                break;
            }
        }
    }
}

*//**
 * 对象写入文件时，文件都有一个文件的头部和文件体，第一次写入时需要写入头部，之后续写的话就不需要头部了
 * 所以自定义MyObjectOutputStream，重写writeStreamHeader写入头部方法，
 * 当用户是向文件续写对象时，使用此Stream，不写入头部
 *//*
class MyObjectOutputStream extends ObjectOutputStream{

    public MyObjectOutputStream(OutputStream out) throws IOException {
        super(out);
    }

    protected MyObjectOutputStream() throws IOException, SecurityException {
    }

    //覆盖父类的方法，将对象写入文件时不写入头部信息
    @Override
    protected void writeStreamHeader() throws IOException {

    }*/
}